package cn.wolfcode.wms.interceptor;

        import cn.wolfcode.wms.domain.Employee;
        import cn.wolfcode.wms.exception.SecurityException;
        import cn.wolfcode.wms.util.RequiredPermission;
        import cn.wolfcode.wms.util.UserContext;
        import org.springframework.web.method.HandlerMethod;
        import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import java.util.Set;

public class SecurityInterceptor extends HandlerInterceptorAdapter {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 1. 获取到当前登录的用户
        Employee currentUser = UserContext.getCurrentUser();
        // 2. 判断是否是超级管理员，如果是，则放行
        if (currentUser.isAdmin()) {
            return true;
        }
        // 3. 判断访问的方法是否需要权限校验，如果不需要，则放行
        HandlerMethod hm = (HandlerMethod) handler;
        if (hm.getMethodAnnotation(RequiredPermission.class) == null) {
            return true;
        }
        // 4. 拼接访问方法的权限表达式
        String expression = hm.getBean().getClass().getName() + ":" + hm.getMethod().getName();
        // 5. 判断该用户是否拥有该访问权限，如果有，则放行
        Set exps = UserContext.getExps();
        if (exps.contains(expression)) {
            return true;
        }

        // 提示用户没有权限
        throw new SecurityException("没有操作权限，请联系管理员！");
    }
}
